package com.gitee.wsl.ext.array.bytes

import com.gitee.wsl.lang.ByteOrder


/** Reads ULong from [reader] with bytes until [length] */
//internal fun initULong(reader: () -> Byte, length: Int = 8): ULong {
//    var long = 0uL
//    // Skip bytes if below certain length
//    if (length < 8) {
//        long = long shl 8 * (8 - length)
//    }
//    for (it in 0 until length) {
//        long = long shl 8
//        long = long xor (reader().toULong() and 0xFFu)
//    }
//    return long
//}
//
///** Create ULong from byte array */
//fun ByteArray.toULong(offset: Int = 0, length: Int = 8): ULong {
//    var index = offset
//    return initULong(reader = { this[index++] }, length = length)
//}

fun ULong.toByteArray(byteOrder: ByteOrder = ByteOrder.BigEndian): ByteArray{
    val bytes = ByteArray(ULong.SIZE_BYTES)
    toByteArray(bytes,byteOrder,0)
    return bytes
}

fun ULong.toByteArray(byteArray: ByteArray,byteOrder: ByteOrder= ByteOrder.BigEndian,startIndex:Int=0){
    byteArray.updateUseLittleEndian(byteOrder,startIndex,ULong.SIZE_BYTES){
        (this shr 8*it).toByte()
    }
}

fun ByteArray.toULong(order: ByteOrder = ByteOrder.BigEndian,startIndex: Int = 0): ULong
{
    var value:ULong = 0u
    getUseLittleEndian(order,startIndex,ULong.SIZE_BYTES) { index, byte -> value = value or (byte.toUByte().toULong() shl 8 * index) }
    return value
}